import java.util.*;
//import java.util.*;

public class Test {
    /*
    Set
     */
    public static void main(String[] args) {
        TreeSet<String> set=new TreeSet<>();
        set.add("abc");
        set.add("def");
        set.add("hello");
        set.add("hello");

        //迭代器
        Iterator<String> it=set.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+" ");
        }//abc def hello
    }



    /*
    Map的使用：Map是⼀种专⻔⽤来进⾏搜索的容器或者数据结构，其搜索的效率与其具体的实例化⼦类有关。

    Map中存储的就是key-value的键值对，Map是Key-Value模型

    Map是⼀个接⼝类，该类没有继承⾃Collection，该类中存储的是<K,V>结构的键值对，并且K⼀定是
    唯⼀的，不能重复。

    Map底层是二叉搜索树，每次存放元素都要进行大小比较-》key的值进行比较

    Map是⼀个接⼝，不能直接实例化对象，如果要实例化对象只能实例化其实现类TreeMap或者
    HashMap

    Map中存放键值对的Key是唯⼀的，value是可以重复的

    在TreeMap中插⼊键值对时，key不能为空，否则就会抛NullPointerException异常，value可以
    为空。但是HashMap的key和value都可以为空。

    Map中的Key可以全部分离出来，存储到Set中来进⾏访问(因为Key不能重复)。

    Map中的value可以全部分离出来，存储在Collection的任何⼀个⼦集合中(value可能有重复)。

    Map中键值对的Key不能直接修改，value可以修改，如果要修改key，只能先将该key删除掉，然
    后再来进⾏重新插⼊。
     */
     /*
    Set的使用：Set是⼀种专⻔⽤来进⾏搜索的容器或者数据结构，其搜索的效率与其具体的实例化⼦类有关。

    Set与Map主要的不同有两点：Set是继承⾃Collection的接⼝类，Set中只存储了Key

    1. Set是继承⾃Collection的⼀个接⼝类
    2. Set中只存储了key，并且要求key⼀定要唯⼀
    3. TreeSet的底层是使⽤Map来实现的，其使⽤key与Object的⼀个默认对象作为键值对插⼊到Map中
    的
    4. Set最⼤的功能就是对集合中的元素进⾏去重
    5. 实现Set接⼝的常⽤类有TreeSet和HashSet，还有⼀个LinkedHashSet，LinkedHashSet是在
    HashSet的基础上维护了⼀个双向链表来记录元素的插⼊次序。
    6. Set中的Key不能修改，如果要修改，先将原来的删除掉，然后再重新插⼊
    7. TreeSet中不能插⼊null的key，HashSet可以。
    8. TreeSet和HashSet的区别【HashSet在课件最后会讲到】

    Set集合：存放在这个集合类中的，都是自动去重的
     */
    public static void main2(String[] args) {
        TreeMap<String,Integer> map=new TreeMap<>();//TreeMap<Key,Value>

        //添加元素-》put
        //NullPointerException:map.put(null,4);
        map.put("def",4);
        map.put("abc",6);
        map.put("abc",3);//之后abc的Value会更新为3

        //根据Key获取Value值-》get
        Integer integer=map.get("abc");
        System.out.println(integer);//3

        //若没有某个元素，则将这个元素的值默认设为什么-》getOrDefault
        integer=map.getOrDefault("abcd",9999);
        System.out.println(integer);//9999
        integer=map.getOrDefault("def",9999);
        System.out.println(integer);//4

        //返回所有Value（返回所有Value的可重复集合）-》values()
        Collection<Integer> collection=map.values();
        System.out.println(collection);//[3, 4]

        //返回所有Key-Value的映射关系-》entrySet()
        //Map.Entry<K, V> 是Map内部实现的⽤来存放<key, value>键值对映射关系的内部类,该内部类中主
        //要提供了<key, value>的获取，value的设置以及Key的⽐较⽅式
        Set<Map.Entry<String,Integer>> entrySet=map.entrySet();
        for(Map.Entry<String,Integer> entry:entrySet){
            System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
        }//key:abc value:3
         //key:def value:4
        System.out.println(map);//{abc=3, def=4}

        //Set集合
        Set<String> set=map.keySet();//import java.util.Set;
        System.out.println(set);//[abc, def]
    }



    /*
    测试BinarySearchTree里面的方法
    */
    public static void main1(String[] args) {
        //测试insert
        int[] array={10,5,12,13,6};//将这个数组里的元素插入到一棵二叉搜索树
        BinarySearchTree binarySearchTree=new BinarySearchTree();//插入到这棵二叉搜索树
        for(int x:array){
            binarySearchTree.insert(x);
        }

        //测试查找
        //TreeNode searchNode=binarySearchTree.search(12);error:静态内部类的使用要依靠外部类
        BinarySearchTree.TreeNode searchNode=binarySearchTree.search(12);
        System.out.println(searchNode.val);//12

        //测试删除
        binarySearchTree.remove(10);
        System.out.println("ooooooooo");//可以在这里打断点调试看有没有删除成功
    }
}
